#ifndef GAMEWINDOW_H
#define GAMEWINDOW_H

#include <QWidget>
#include <QTimer>
#include <QPainter>
#include <QKeyEvent>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <gamedia.h>
#include "myParam.h"

namespace Ui {
class gamewindow;
}

class gamewindow : public QWidget
{
    Q_OBJECT

public:
    explicit gamewindow(QWidget *parent = nullptr);
    ~gamewindow();
    void paintEvent(QPaintEvent *event) override;
    void keyPressEvent(QKeyEvent *event) override;

public:
    // 初始化游戏参数
    void initGameArgs();
    // 画游戏地图
    void printMap();
    // 画snake
    void printMoveSnake();
    // 画得分节点
    void printScoreNode();
    // 生成初始化snake节点
    void genInitSnakeNode();
    // 生成移动snake节点
    void genMoveSnakeNode();
    // 生成得分节点
    void genScoreNode();
    // 判断是否吃到score
    bool judgeEatScore(int row, int col, snakeNode* node);
    // 判断是否游戏失败
    bool judgeGameFail(int row, int col);
    // 设置游戏状态
    void setGameStatus(int status);
    // 重置游戏参数
    void resetGame();
    // 背景音乐
    void initSound();

    void initFailSound();

    void initEatSound();

private:
    Ui::gamewindow *ui;
    // 全局游戏参数
    myArg gameArgs;
    // 定时器
    QTimer *ticker;
    // 画笔
    QPainter *gamePainter;
    // 对话框
    gamedia gamedia;

    // 背景音乐
    QMediaPlayer gameSound;
    QMediaPlaylist soundList;

    // 失败音乐
    QMediaPlayer gameFailSound;
    QMediaPlaylist soundFailList;

    // eat音乐
    QMediaPlayer gameEatSound;
    QMediaPlaylist soundEatList;

signals:
    // 游戏状态信号
    void gameStatusSig(int staus);
    // 生成得分节点信号
    void genScoreNodeSig();
    // 游戏得分信号
    void genScoreSig(int score);
    // 游戏失败信号
    void genGameFailSig();
    // eat信号
    void genEatSig();

public slots:
    // 定时器信号处理
    void hanldeTickerTimerout();
    // 生成得分节点信号处理
    void handleGenScoreNode();
    // 对话框按钮OK信号处理
    void handleDialogOk();
    // 处理游戏暂停事件
    void handleGamePause();
    // 处理游戏失败信号
    void handleGameFail();
    // 处理eat信号
    void handleGameEat();
    // 循环播放的mediaplayer需要处理这个信号
    void handleBgSoundStatus(QMediaPlayer::MediaStatus status);

};

#endif // GAMEWINDOW_H
